package org.example;

import org.example.edup.helloword;
import org.example.entity.user;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.List;

//TIP To <b>Run</b> code, press <shortcut actionId="Run"/> or
// click the <icon src="AllIcons.Actions.Execute"/> icon in the gutter.
public class Main {
    public static void main(String[] args) {
        //1、创建Spring的IOC容器对象
//        ApplicationContext 是 BeanFactory 的子接口之一，也是其最高级接口之一，并对 BeanFactory 功能做了许多的扩展，所以在绝大部分的工作场景下，都会使用 ApplicationContext 作为 IOC 容器。
//        调用ApplicationContext，创建了一个对象，获取spring.xml里的数据并把数据赋给对象
        ApplicationContext a= new ClassPathXmlApplicationContext("spring.xml");
//        class是实现类，获取类路径下Spring的配置文件，并把它赋给接口定义的对象
        //2、从IOC的容器中获取Bean实例并创建一个对象，创建对象时就会调用它的构造方法x
        helloword h = (helloword) a.getBean("helloword");
//        调用helloword中的其他构造方法
        h.add();
        //如果实例中有toString()方法，就会调用，如果没有，就会使用Object 类的默认实现
//       System.out.println() 会调用对象的 toString() 方法， Object 类的默认实现会返回类名和哈希码。
//        String ab=helloWord.toString();
//        System.out.println(ab);
        //以下两个方法，似乎无法调用helloWord中的方法，输出的都是路径，或者说只要是输出，都是路径
        //或许只有容器中属于class类型的唯一的Bean实例才能调用。
        //nonono，原来如此，单例模式，对象有且只可能会被创建一次。
        // Spring 的单例机制。默认情况下，Spring 的 Bean 是单例的，这意味着第一次调用 getBean 时会创建一个新的实例，而后续调用会返回同一个实例。如果用户在第一次调用时已经创建了 helloword 实例，并且没有销毁 Spring 容器，那么第二次调用 getBean 时不会触发构造方法。这是一个合理的假设。
//
//        helloword helloworld2 = a.getBean("helloword",helloword.class);
//        System.out.println(helloworld2);

//        Object helloworld3 = a.getBean("helloword");
//        System.out.println(helloworld3.toString());
//        BeanFactory 容器
//        BeanFactory 是 IOC 容器所定义的最底层接口，面向 Spring 本身，它提供了 IOC 最底层的设计，因此我们来看看该类中提供的几个主要方法：
//
//        boolean containsBean(String name)：判断容器是否包含id为name的Bean实例。
//
//        Object getBean(String name)：获取容器中id为name的Bean实例。
//        在这里，Object就相当于helloword，跟new一个实例对象的用法类似
//
//<T> getBean(Class<T> class)：获取容器中属于class类型的唯一的Bean实例。
//
//<T> T getBean(String name,Class class)：获取容器中id为name，并且类型为class的Bean。
//
//        Class <?> getType(String name)：获取容器中指定Bean实例的类型
//        判断spring容器中是否含有id为helloWord的bean实例，返回值为布尔值
        boolean s = a.containsBean("helloword");
        System.out.println(s);
//        user user = (user) a.getBean("user");
//        System.out.println(user);
//        user user2 = (user) a.getBean("user2");
//        System.out.println(user2);
        user u = (user) a.getBean("userd");
        System.out.println(u.toString());
//        List<user> l= h.geta(a);
//        boolean as = a.containsBean("user");
//        if(as){
//            for(user i:l){
//                System.out.println(i);
//            }
//        }
//        返回值为true，存在
    }
}